# training_visualization.py
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置为黑体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号

def plot_training_history(history, model_name="模型", save_path=None):
    """
    绘制训练历史曲线，包括损失和准确率

    Args:
        history: 训练历史对象
        model_name: 模型名称
        save_path: 保存路径，如果为None则不保存
    """
    # 创建图形和子图
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))

    # 绘制训练和验证损失
    ax1.plot(history.history['loss'], label='训练损失')
    ax1.plot(history.history['val_loss'], label='验证损失')
    ax1.set_title(f'{model_name}损失')
    ax1.set_xlabel('Epoch')
    ax1.set_ylabel('Loss')
    ax1.legend()
    ax1.grid(True)

    # 绘制训练和验证准确率
    ax2.plot(history.history['accuracy'], label='训练准确率')
    ax2.plot(history.history['val_accuracy'], label='验证准确率')
    ax2.set_title(f'{model_name}准确率')
    ax2.set_xlabel('Epoch')
    ax2.set_ylabel('Accuracy')
    ax2.legend()
    ax2.grid(True)

    # 调整布局
    plt.tight_layout()

    # 保存图像（如果指定了路径）
    if save_path:
        plt.savefig(save_path, dpi=300, bbox_inches='tight')

    # 显示图像
    plt.show()
